#include "ota_http_curl.h"
#include "curl/curl.h"
#include <stdlib.h>
#include <string.h>
#include <log.h>

/**
 * 定义 data 如何接收到用户的容器中
 * //1 先计算长度
 * //2 把user_data强转为 response_body_t*
 * //3 创建response_body中的str  根据实际数据的长度申请空间  长度+1
 * //4 把data拷贝到str中 memcpy
 * //5 长度赋值给response_body->len
 */
static size_t ota_http_write_callback(char *data, size_t size, size_t nmemb, void *userdata)
{
    log_info("开始接收数据");
    // 1 先计算长度
    size_t len = size * nmemb;
    // 2 把user_data强转为 response_body_t*
    response_body_t *response_body = (response_body_t *)userdata;
    // 3 创建response_body中的str  根据实际数据的长度申请空间  长度+1
    response_body->str = malloc(len + 1);
    // 4 把data拷贝到str中 memcpy
    memcpy(response_body->str, data, len);
    // 5 补充 结束符
    response_body->str[len] = '\0';
    // 6 长度赋值给response_body->len
    response_body->len = len+1;
    log_info("接收数据完成");
    return len; // 必须和 size * nmemb相等 否则会失败
}

/**
 *    访问网络url 获得对应的文本数据
 *    1  初始化curl对象  init
 *    2  给curl 设置参数 set opt： 1 要访问的url 2 如果获得文本数据，如何接收的回调函数 3 回调函数接收的容器（开辟好空间）
 *    3  执行访问 perform
 *    4  清理 curl对象  cleanup
 **/
response_body_t *ota_http_get(const char *url)
{ // *    1  初始化curl对象  init
    CURL *curl = curl_easy_init();
    if (curl == NULL)
    {
        return NULL;
    }

    //*    2  给curl 设置参数 set opt： 1 要访问的url 2 如果获得文本数据，如何接收的回调函数 3 回调函数接收的容器（开辟好空间）
    curl_easy_setopt(curl, CURLOPT_URL, url);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, ota_http_write_callback);
    response_body_t *response_body = malloc(sizeof(response_body_t));
    curl_easy_setopt(curl, CURLOPT_WRITEDATA,(void *) response_body);

    //*    3  执行访问 perform
    CURLcode res = curl_easy_perform(curl);
    if (res != CURLE_OK)
    {
        curl_easy_cleanup(curl);
        free(response_body);
        return NULL;
    }

    //*    4  清理 curl对象  cleanup
    curl_easy_cleanup(curl);
    return response_body;
}

/**
 *    访问网络url 下载u对应的二进制文件
 */
int ota_http_download(const char *url, const char *file_name)
{
    // *    1  初始化curl对象  init
    CURL *curl = curl_easy_init();
    if (curl == NULL)
    {
        return -1;
    }

    //*    2  给curl 设置参数 set opt： 1 要访问的url 2 如果获得文本数据，如何接收的回调函数 3 回调函数接收的容器（开辟好空间）
    curl_easy_setopt(curl, CURLOPT_URL, url);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, fwrite);
    FILE *file = fopen(file_name, "wb");
    curl_easy_setopt(curl, CURLOPT_WRITEDATA,(void *) file);

    //*    3  执行访问 perform
    CURLcode res = curl_easy_perform(curl);
    if (res != CURLE_OK)
    {
        curl_easy_cleanup(curl);
        fclose(file);
        return -1;
    }

    //*    4  清理 curl对象  cleanup
    curl_easy_cleanup(curl);
    fclose(file);
    return 0;
}